#include <iostream>
#include <pthread.h>
#include <unistd.h>
#include <string>
#include <functional>
#include <signal.h>
#include <time.h>
#include "Thread.hpp"
#include "Blockqueue.hpp"
#include "RingQueue.hpp"
// using namespace std;
// void print(const std::string& name, Data<int>* data)
// {

// }
// int main()
// {
//     Data<int>* p = new Data<int>(10);
//     Thread<Data<int>> t("thread", p, print);
//     t.Start();
//     std::cout << "tid:" << pthread_self() << std::endl;
//     t.Join();
//     delete p;
//     return 0;
// }
// void handler(int x)
// {
//     std::cout << "收到" << x << "信号" << std::endl;
// }
// int main()
// {
//     signal(2, handler);
//     std::cout << getpid() << std::endl;
//     while(1)
//     {
//         std::cout << "已经屏蔽了2号信号" << std::endl;
//         sleep(1);
//     }
//     return 0;
// }


// __thread int tickets = 100;
// thread_local int tickets = 100;
// pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
// int tickets = 1000;
// void* ThreadRoutine(void* args)
// {
//     char * name = static_cast<char*>(args);
//     while(1)
//     {
//         pthread_mutex_lock(&mutex);
//         if(tickets > 0)
//         {
//             usleep(100);
//             std::cout << name << "抢到了一张票" << " tid: " <<  pthread_self() << " tickets "<< tickets << std::endl;
//             tickets--;
//             pthread_mutex_unlock(&mutex);
//         }
//         else
//         {
//             pthread_mutex_unlock(&mutex);
//             break;
//         }
//     }
//     return nullptr;
// }

// pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
// pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
// void* ThreadRoutine(void* args)
// {
//     char * name = static_cast<char*>(args);
//     while(1)
//     {
//         pthread_mutex_lock(&mutex);
//         pthread_cond_wait(&cond, &mutex);
//         std::cout << name << " " << "tid : " << pthread_self() << std::endl;
//         pthread_mutex_unlock(&mutex);
//     }
// }
// int main()
// {
//     pthread_t tid1, tid2, tid3, tid4;
//     pthread_create(&tid1, nullptr, ThreadRoutine, (void*)"thread1");
//     pthread_create(&tid2, nullptr, ThreadRoutine, (void*)"thread2");
//     pthread_create(&tid3, nullptr, ThreadRoutine, (void*)"thread3");
//     pthread_create(&tid4, nullptr, ThreadRoutine, (void*)"thread4");
//     while(1)
//     {
//         pthread_cond_signal(&cond);
//         usleep(100);
//     }
//     pthread_join(tid1, nullptr);
//     pthread_join(tid2, nullptr);
//     pthread_join(tid3, nullptr);
//     pthread_join(tid4, nullptr);
//     return 0;
// }

void* Push(void* args)
{
    RingQueue<int>* bq = static_cast<RingQueue<int>*>(args);
    while(1)
    {
        int x = rand();
        bq->Push(x);
        std::cout << pthread_self() << " 生成 " << x << std::endl;
        usleep(100);
    }
}

void* Pop(void* args)
{
    RingQueue<int>* bq = static_cast<RingQueue<int>*>(args);
    while(1)
    {
        int out;
        bq->Pop(&out); 
        std::cout << pthread_self() << " 获得 " << out << std::endl;
    }
}

int main()
{
    srand(time(nullptr));
    // BlockQueue<int>* bq = new BlockQueue<int>(10);
    RingQueue<int>* rq = new RingQueue<int>(10);
    pthread_t tid1, tid2, tid3, tid4;
    pthread_create(&tid1, nullptr, Push, (void*)rq);
    pthread_create(&tid2, nullptr, Push, (void*)rq);
    pthread_create(&tid3, nullptr, Pop, (void*)rq);
    pthread_create(&tid4, nullptr, Pop, (void*)rq);

    pthread_join(tid1, nullptr);
    pthread_join(tid2, nullptr);
    pthread_join(tid3, nullptr);
    pthread_join(tid4, nullptr);
    return 0;
}